使用Embedding API

本文对应源代码在此处,如需复现可下载运行源代码。

一、使用OpenAI API

GPT有封装好的接口,我们简单封装即可。目前GPT embedding mode有三种,性能如下所示:

image

  • MTEB得分为embedding model分类、聚类、配对等八个任务的平均得分。
  • MIRACL得分为embedding model在检索任务上的平均得分。

从以上三个embedding model我们可以看出text-embedding-3-large有最好的性能和最贵的价格,当我们搭建的应用需要更好的表现且成本充足的情况下可以使用;text-embedding-3-small有着较好的性能跟价格,当我们预算有限时可以选择该模型;而text-embedding-ada-002是OpenAI上一代的模型,无论在性能还是价格都不如及前两者,因此不推荐使用。

  1. import os
  2. from openai import OpenAI
  3. from dotenv import load_dotenv, find_dotenv
  4. # 读取本地/项目的环境变量。
  5. # find_dotenv()寻找并定位.env文件的路径
  6. # load_dotenv()读取该.env文件,并将其中的环境变量加载到当前的运行环境中
  7. # 如果你设置的是全局的环境变量,这行代码则没有任何作用。
  8. _ = load_dotenv(find_dotenv())
  9. # 如果你需要通过代理端口访问,你需要如下配置
  10. os.environ['HTTPS_PROXY'] = 'http://127.0.0.1:7890'
  11. os.environ["HTTP_PROXY"] = 'http://127.0.0.1:7890'
  12. def openai_embedding(text: str, model: str=None):
  13. # 获取环境变量 OPENAI_API_KEY
  14. api_key=os.environ['OPENAI_API_KEY']
  15. client = OpenAI(api_key=api_key)
  16. # embedding model:'text-embedding-3-small', 'text-embedding-3-large', 'text-embedding-ada-002'
  17. if model == None:
  18. model="text-embedding-3-small"
  19. response = client.embeddings.create(
  20. input=text,
  21. model=model
  22. )
  23. return response
  24. response = openai_embedding(text='要生成 embedding 的输入文本,字符串形式。')

API返回的数据为json格式,除object向量类型外还有存放数据的data、embedding model 型号model以及本次 token 使用情况usage等数据,具体如下所示:

  1. {
  2. "object": "list",
  3. "data": [
  4. {
  5. "object": "embedding",
  6. "index": 0,
  7. "embedding": [
  8. -0.006929283495992422,
  9. ... (省略)
  10. -4.547132266452536e-05,
  11. ],
  12. }
  13. ],
  14. "model": "text-embedding-3-small",
  15. "usage": {
  16. "prompt_tokens": 5,
  17. "total_tokens": 5
  18. }
  19. }

我们可以调用response的object来获取embedding的类型。

  1. print(f'返回的embedding类型为:{response.object}')
  1. 返回的embedding类型为:list

embedding存放在data中,我们可以查看embedding的长度及生成的embedding。

  1. print(f'embedding长度为:{len(response.data[0].embedding)}')
  2. print(f'embedding(前10)为:{response.data[0].embedding[:10]}')
  1. embedding长度为:1536
  2. embedding(前10)为:[0.03884002938866615, 0.013516489416360855, -0.0024250170681625605, -0.01655769906938076, 0.024130908772349358, -0.017382603138685226, 0.04206013306975365, 0.011498954147100449, -0.028245486319065094, -0.00674333656206727]

我们也可以查看此次embedding的模型及token使用情况。

  1. print(f'本次embedding model为:{response.model}')
  2. print(f'本次token使用情况为:{response.usage}')
  1. 本次embedding model为:text-embedding-3-small
  2. 本次token使用情况为:Usage(prompt_tokens=12, total_tokens=12)

二、使用文心千帆API

Embedding-V1是基于百度文心大模型技术的文本表示模型,Access token为调用接口的凭证,使用Embedding-V1时应先凭API Key、Secret Key获取Access token,再通过Access token调用接口来embedding text。同时千帆大模型平台还支持bge-large-zh等embedding model。

  1. import requests
  2. import json
  3. def wenxin_embedding(text: str):
  4. # 获取环境变量 wenxin_api_key、wenxin_secret_key
  5. api_key = os.environ['QIANFAN_AK']
  6. secret_key = os.environ['QIANFAN_SK']
  7. # 使用API Key、Secret Key向https://aip.baidubce.com/oauth/2.0/token 获取Access token
  8. url = "https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id={0}&client_secret={1}".format(api_key, secret_key)
  9. payload = json.dumps("")
  10. headers = {
  11. 'Content-Type': 'application/json',
  12. 'Accept': 'application/json'
  13. }
  14. response = requests.request("POST", url, headers=headers, data=payload)
  15. # 通过获取的Access token 来embedding text
  16. url = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/embeddings/embedding-v1?access_token=" + str(response.json().get("access_token"))
  17. input = []
  18. input.append(text)
  19. payload = json.dumps({
  20. "input": input
  21. })
  22. headers = {
  23. 'Content-Type': 'application/json'
  24. }
  25. response = requests.request("POST", url, headers=headers, data=payload)
  26. return json.loads(response.text)
  27. # text应为List(string)
  28. text = "要生成 embedding 的输入文本,字符串形式。"
  29. response = wenxin_embedding(text=text)

Embedding-V1每次embedding除了有单独的id外,还有时间戳记录embedding的时间。

  1. print('本次embedding id为:{}'.format(response['id']))
  2. print('本次embedding产生时间戳为:{}'.format(response['created']))
  1. 本次embedding id为:as-hvbgfuk29u
  2. 本次embedding产生时间戳为:1711435238

同样的我们也可以从response中获取embedding的类型和embedding。

  1. print('返回的embedding类型为:{}'.format(response['object']))
  2. print('embedding长度为:{}'.format(len(response['data'][0]['embedding'])))
  3. print('embedding(前10)为:{}'.format(response['data'][0]['embedding'][:10]))
  1. 返回的embedding类型为:embedding_list
  2. embedding长度为:384
  3. embedding(前10)为:[0.060567744076251984, 0.020958080887794495, 0.053234219551086426, 0.02243831567466259, -0.024505289271473885, -0.09820500761270523, 0.04375714063644409, -0.009092536754906178, -0.020122773945331573, 0.015808865427970886]

三、使用讯飞星火API

尚未开放

四、使用智谱API

智谱有封装好的SDK,我们调用即可。

  1. from zhipuai import ZhipuAI
  2. def zhipu_embedding(text: str):
  3. api_key = os.environ['ZHIPUAI_API_KEY']
  4. client = ZhipuAI(api_key=api_key)
  5. response = client.embeddings.create(
  6. model="embedding-2",
  7. input=text,
  8. )
  9. return response
  10. text = '要生成 embedding 的输入文本,字符串形式。'
  11. response = zhipu_embedding(text=text)

response为zhipuai.types.embeddings.EmbeddingsResponded类型,我们可以调用objectdatamodelusage来查看response的embedding类型、embedding、embedding model及使用情况。

  1. print(f'response类型为:{type(response)}')
  2. print(f'embedding类型为:{response.object}')
  3. print(f'生成embedding的model为:{response.model}')
  4. print(f'生成的embedding长度为:{len(response.data[0].embedding)}')
  5. print(f'embedding(前10)为: {response.data[0].embedding[:10]}')
  1. response类型为:<class 'zhipuai.types.embeddings.EmbeddingsResponded'>
  2. embedding类型为:list
  3. 生成embeddingmodel为:embedding-2
  4. 生成的embedding长度为:1024
  5. embedding(前10)为: [0.017892399802803993, 0.0644201710820198, -0.009342825971543789, 0.02707476168870926, 0.004067837726324797, -0.05597858875989914, -0.04223804175853729, -0.03003198653459549, -0.016357755288481712, 0.06777040660381317]

本文对应源代码在此处,如需复现可下载运行源代码。